﻿//#include <iostream>
//using namespace std;
//#define ok 0
//#define error -1
//// 顺序表类定义
//class SeqList
//{
//private:
//    int* list;      // 元素数组
//    int maxsize;    // 顺序表最大长度
//    int size;       // 顺序表实际长度
//public:
//    SeqList()
//    {
//        maxsize = 1000;
//        size = 0;
//        list = new int[maxsize];
//    }
//    SeqList(int n, int* p)
//    {
//        maxsize = 1000;
//        list = new int[maxsize];
//        size = n;
//        for (int i = 0; i < n; i++)
//        {
//            list[i] = p[i];
//        }
//    }
//    ~SeqList()
//    {
//        delete[]list;
//    }
//    int list_insert(int i, int item)
//    {
//        if (i<1 || i>size+1 )
//        {
//            return -1;
//        }
//        else
//        {
//            for (int j = size - 1; j >= i - 1; j--)
//            {
//                list[j + 1] = list[j];
//            }
//            list[i - 1] = item;
//            size++;
//            return 0;
//        }
//    }
//    int list_del(int i)
//    {
//        if (i<1 || i>size )
//        {
//            return -1;
//        }
//        else
//        {
//            for (int j = i; j < size; j++)
//            {
//                list[j-1] = list[j ];
//            }
//            size--;
//            return 0;
//        }
//    }
//    int list_get(int i)
//    {
//        if (i<1 || i>size)
//        {
//            return -1;
//        }
//        else
//        {
//            cout << list[i - 1] << endl;
//            return 0;
//        }
//    }
//    void list_display()
//    {
//        cout << size << " ";
//        for (int i = 0; i < size; i++)
//        {
//            cout << list[i]<<" ";
//        }
//        cout << endl;
//    }
//};
//int main()
//{
//    int n,m,i;
//    cin >> n;
//    int* p = new int[n];
//    for (int i = 0; i < n; i++)
//    {
//        cin >> p[i];
//    }
//    SeqList seqList(n, p);
//    seqList.list_display();
//    for (int j = 0; j < 2; j++)
//    {
//        cin >> i>>m;
//        int temp= seqList.list_insert(i, m);
//        if (temp == -1)
//        {
//            cout << "error" << endl;
//        }
//        else
//        {
//            seqList.list_display();
//        }
//    }
//    for (int j = 0; j < 2; j++)
//    {
//        cin >> i;
//        int temp=seqList.list_del(i);
//        if (temp == -1)
//        {
//            cout << "error" << endl;
//        }
//        else
//        {
//            seqList.list_display();
//        }
//    }
//    for (int j = 0; j < 2; j++)
//    {
//        cin >> i;
//       int temp= seqList.list_get(i);
//       if (temp == -1)
//       {
//           cout << "error" << endl;
//       }
//    }
//    delete[]p;
//    return 0;
//}
//#include <iostream>
//using namespace std;
//#define ok 0
//#define error -1
//// 顺序表类定义
//class SeqList
//{
//private:
//    int* list;      // 元素数组
//    int maxsize;    // 顺序表最大长度
//    int size;       // 顺序表实际长度
//public:
//    SeqList()
//    {
//        maxsize = 1000;
//        size = 0;
//        list = new int[maxsize];
//    }
//    SeqList(int n, int* p)
//    {
//        maxsize = 1000;
//        list = new int[maxsize];
//        size = n;
//        for (int i = 0; i < n; i++)
//        {
//            list[i] = p[i];
//        }
//    }
//    ~SeqList()
//    {
//        delete[]list;
//    }
//    int multiinsert(int i, int m, int item[])
//    {
//        if (i<1 || i>size + 1)
//        {
//            return -1;
//        }
//        else
//        {
//            for (int j = size - 1; j >= i - 1; j--)
//            {
//                list[j + m] = list[j];
//            }
//            for (int j= 0; j< m; j++)
//            {
//                list[i-1] = item[j];
//                i++;
//            }
//            size += m;
//            return 0;
//        }
//    }
//    int multidel(int i, int n)
//    {
//        if (i<1 || i>size)
//        {
//            return -1;
//        }
//        else
//        {
//            for (int j = i+n-1; j <size; j++)
//            {
//                list[j - n] = list[j];
//            }
//            size -= n;
//            return 0;
//        }
//    }
//    void list_display()
//    {
//        cout << size << " ";
//        for (int i = 0; i < size; i++)
//        {
//            cout << list[i] << " ";
//        }
//        cout << endl;
//    }
//};
//int main()
//{
//    int n, m, i,k;
//    cin >> n;
//    int* p = new int[n];
//    for (int i = 0; i < n; i++)
//    {
//        cin >> p[i];
//    }
//    SeqList seqList(n, p);
//    seqList.list_display();
//    cin >> i >> m;
//    int* p1 = new int[m];
//    for (int i = 0; i < m; i++)
//    {
//        cin >> p1[i];
//    }
//    if (seqList.multiinsert(i, m, p1) == -1)
//    {
//        cout << "error" << endl;
//    }
//    else
//    {
//        seqList.list_display();
//    }
//     cin >> i>>k;
//     if (seqList.multidel(i,k) == -1)
//     {
//            cout << "error" << endl;
//     }
//     else
//     {
//         seqList.list_display();
//     }
//    delete[]p;
//    delete[]p1;
//    return 0;
//}
//#include <iostream>
//using namespace std;
//#define ok 0
//#define error -1
//// 顺序表类定义
//class SeqList
//{
//private:
//    int* list;      // 元素数组
//    int maxsize;    // 顺序表最大长度
//    int size;       // 顺序表实际长度
//public:
//    SeqList()
//    {
//        maxsize = 1000;
//        size = 0;
//        list = new int[maxsize];
//    }
//    SeqList(int n, int* p,int m,int *p1)
//    {
//        maxsize = 1000;
//        list = new int[maxsize];
//        size = n+m;
//        for (int i = 0; i < n; i++)
//        {
//            list[i] = p[i];
//        }
//        for (int i = 0; i < m; i++)
//        {
//            list[n] = p1[i];
//            n++;
//        }
//    }
//    void list_display()
//    {
//        cout << size << " ";
//        for (int i = 0; i < size; i++)
//        {
//            for (int j = 0; j < size - 1 - i; j++)
//            {
//                if (list[j] > list[j + 1])
//                {
//                    int temp = list[j];
//                    list[j] = list[j + 1];
//                    list[j + 1] = temp;
//                }
//            }
//        }
//        for (int i = 0; i < size; i++)
//        {
//            cout << list[i] << " ";
//       }
//    }
//};
//int main()
//{
//    int n, m;
//    cin >> n;
//    int* p = new int[n];
//    for (int i = 0; i < n; i++)
//    {
//        cin >> p[i];
//    }
//    cin >> m;
//    int* p1 = new int[m];
//    for (int i = 0; i < m; i++)
//    {
//        cin >> p1[i];
//    }
//    SeqList seqList(n,p,m, p1);
//    seqList.list_display();
//    delete[]p;
//    delete[]p1;
//    return 0;
//}
//#include <iostream>
//using namespace std;
//#define ok 0
//#define error -1
//// 顺序表类定义
//class SeqList
//{
//private:
//    int* list;      // 元素数组
//    int maxsize;    // 顺序表最大长度
//    int size;       // 顺序表实际长度
//public:
//    SeqList()
//    {
//        maxsize = 1000;
//        size = 0;
//        list = new int[maxsize];
//    }
//    SeqList(int n, int* p)
//    {
//        maxsize = 1000;
//        list = new int[maxsize];
//        size = n;
//        for (int i = 0; i < n; i++)
//        {
//            list[i] = p[i];
//        }
//    }
//   /* void left_change(int d, int s)
//    {
//        for (int i = 0; i < s; i++)
//        {
//            list[size] = list[i];
//            size++;
//        }
//        for (int i = s; i < size; i++)
//        {
//            list[i-s] = list[i];
//        }
//        size -= s;
//    }*/
//    void left_change(int d, int s)
//    {
//        int* p = new int[s];
//        for (int i = 0; i < s; i++)
//        {
//            p[i] = list[i];
//        }
//        for (int i = s; i < size; i++)
//        {
//            list[i - s] = list[i];
//        }
//        for (int i = 0; i < s; i++)
//        {
//            list[i+s] = p[i];
//        }
//    }
//    void right_change(int d, int s)
//    {
//        int* p = new int[s];
//        for (int i = 0; i < s; i++)
//        {
//            p[i] = list[i+size-s];
//        }
//        for (int i =0 ; i < size-s; i++)
//        {
//            list[i+s] = list[i];
//        }
//        for (int i = 0; i < s ; i++)
//        {
//            list[i] = p[i];
//        }
//    }
//    void list_display()
//    {
//        for (int i = 0; i < size; i++)
//        {
//            cout << list[i] << " ";
//        }
//        cout << endl;
//    }
//};
//int main()
//{
//    int n, m,d,s;
//    cin >> n;
//    int* p = new int[n];
//    for (int i = 0; i < n; i++)
//    {
//        cin >> p[i];
//    }
//    SeqList seqList(n, p);
//    seqList.list_display();
//    for (int i = 0; i < 2; i++)
//    {
//        cin >> d >> s;
//        if (d == 0)
//        {
//            seqList.left_change(d, s);
//        }
//        else if(d==1)
//        {
//            seqList.right_change(d, s);
//        }
//        seqList.list_display();
//    }
//    delete[]p;
//    return 0;
//}
//#include <iostream>
//using namespace std;
//#define ok 0
//#define error -1
//class SeqList
//{
//private:
//	int* list;
//	int size;
//public:
//	SeqList(int n, int *p)
//	{
//		size = n;
//		list = new int[size];//注意分配内存
//		for (int i = 0; i < size; i++)
//		{
//			list[i] = p[i];
//		}
//	}
//	void change()
//	{
//		for (int i = 0; i < size;i++)
//		{
//			for (int j = i+1; j < size; )
//			{
//				if (list[i] == list[j])
//				{
//					for (int k = j; k < size - 1; k++)//注意边界，k=size-1,k+1=szie了
//					{
//						list[k] = list[k + 1];
//					}
//					size--;
//				}
//				else
//				{
//					j++;
//				}
//			}
//		}
//	}
//	void print()
//	{
//		cout << size << " ";
//		for (int i = 0; i < size; i++)
//		{
//			cout << list[i] << " ";
//		}
//		cout << endl;
//	}
//};
//int main()
//{
//	int t,n;
//	cin >> t;
//	for (int i = 0; i < t; i++)
//	{
//		cin>> n;
//		int* p = new int[n];
//		for (int i = 0; i < n; i++)
//		{
//			cin >> p[i];
//		}
//		SeqList seqList(n, p);
//		seqList.change();
//		seqList.print();	
//		delete[]p;
//	}
//
//}

//class SeqList
//{
//private:
//	int* list;
//	int size;
//public:
//	SeqList(int n, int* p)
//	{
//		size = n;
//		list = new int[size];//注意分配内存
//		for (int i = 0; i < size; i++)
//		{
//			list[i] = p[i];
//		}
//	}
//	void change()
//	{
//		for (int i = 0; i < size; i++)
//		{
//			for (int j = i + 1; j < size; )
//			{
//				if (list[i] == list[j])
//				{
//					for (int k = j; k < size - 1; k++)//注意边界，k=size-1,k+1=szie了
//					{
//						list[k] = list[k + 1];
//					}
//					size--;
//				}
//				else
//				{
//					j++;
//				}
//			}
//		}
//	}
//	void print()
//	{
//		cout << size << " ";
//		for (int i = 0; i < size; i++)
//		{
//			cout << list[i] << " ";
//		}
//		cout << endl;
//	}
//};
// 
#include <iostream>
using namespace std;
#define ok 0
#define error -1
void printf(int p1,int p2)
{
	if (p2 == 0)
	{
		if (p1 < 0)
		{
			cout << "(" << p1 << ")";
		}
		else
			cout << p1;
	}
	else	if (p1 < 0)
	{
		cout << "(" << p1 << ")" << "x^" << p2;
	}
	else if (p2 < 0)
	{
		cout << p1 << "x^" << "(" << p2 << ")";
	}
	else
	{
		cout << p1 << "x^" << p2;
	}
}
int main()
{
	int t, n1, n2;
	cin >> t;
	for (int m = 0; m < t; m++)
	{
		cin >> n1;
		int(*p1)[2] = new int[n1][2];
		for (int i = 0; i < n1; i++)
		{
			for (int j = 0; j < 2; j++)
			{
				cin >> p1[i][j];
			}
		}
		for (int i = 0; i < n1; i++)
		{
			printf(p1[i][0], p1[i][1]);
			if (i != n1 - 1)
			{
				cout << " + ";
			}
		}
		cout << endl;
		cin >> n2;
		int(*p2)[2] = new int[n2][2];
		for (int i = 0; i < n2; i++)
		{
			for (int j = 0; j < 2; j++)
			{
				cin >> p2[i][j];
			}
		}
		int c = 0;
		for (c = 0; c < n2; c++)
		{
			printf(p2[c][0], p2[c][1]);
			if (c != n2 - 1)
			{
				cout << " + ";
			}
		}
		cout << endl;
		int q = 0, k = 0,flag=0;
		while (q < n1 && k < n2)
		{
			if (p1[q][1] == p2[k][1])
			{
				p1[q][0] = p1[q][0] + p2[k][0];
				if (p1[q][0] != 0)
				{
					if(flag!=0)
					{
						cout << " + ";
					}
					printf(p1[q][0], p1[q][1]);
					flag=1;
				}
				q++;
				k++;
			}
			else if (p1[q][1] > p2[k][1])
			{
				if (p2[k][0] != 0)
				{
					if (flag != 0)
					{
						cout << " + ";
					}
					printf(p2[k][0], p2[k][1]);
					flag = 1;
				}
				k++;
			}
			else if (p1[q][1] < p2[k][1])
			{
				if (p1[q][0] != 0)
				{
					if (flag != 0)
					{
						cout << " + ";
					}
					printf(p1[q][0], p1[q][1]);
					flag = 1;
				}
				q++;
			}
		}
		while (q < n1)
		{
			if (p1[q][0] != 0)
			{
				if (flag != 0)
				{
					cout << " + ";
				}
				printf(p1[q][0], p1[q][1]);
				flag = 1;
			}	
			q++;
		}
		while (k < n2)
		{
			if (p2[k][0] != 0)
			{
				if (flag != 0)
				{
					cout << " + ";
				}
				printf(p2[k][0], p2[k][1]);
				flag=1;
			}	
			k++;
		}
		cout << endl;
		delete []p1;
		delete []p2;
	}
	return 0;
}